Control Buses

Just like .kr is control rate and .ar audio rate, there are Control Buses as well as the Audio Buses.



a= Bus.audio(s,1) //makes a 1-channel (mono) virtual audio bus

c= Bus.control(s,1) //makes a 1-channel (mono) virtual control bus

a.index //index of this bus

c.index //and of the control bus























When you set a value you are setting the current value held by the bus. You can also write to and from any bus using In and Out:

c.set(9); //set current value to 9

If in a SynthDef I used 

Out.kr(c.index, SinOsc.kr)  //Any other .kr UGen other than SinOsc could go here

I would be writing at control rate to the control bus over time, and might read it somewhere else:

In.kr(c.index, 1) //read 1 channel from this control bus location

This is a standard method of inter-Node communication- different Synths can read or write to the same bus. 

Any argument of a Synth can be mapped to by control buses:

(
SynthDef(\mapexample,{arg freq=440;

Out.ar(0,SinOsc.ar(freq,0,0.1))
}).add
)

g= Synth(\mapexample);

c.set(660);

g.map(\freq, c.index)

c.set(770);

h= {Out.kr(c.index, SinOsc.ar(550,0,100,1000))}.play;

h.free;

g.set(\freq, 550)



Here is an additional example involving PlayBuf

(
//this loads into a buffer the default sound that comes with SuperCollider
//.read brings in the whole sound at once
b = Buffer.read(s,Platform.resourceDir +/+"sounds/a11wlk01.wav");

SynthDef("playbuf",{ arg out=0,bufnum=0, rate=1, trigger=1, startPos=0, loop=1;
	Out.ar(out,
		Pan2.ar(PlayBuf.ar(1,bufnum, BufRateScale.kr(bufnum)*rate, trigger, BufFrames.ir(b.bufnum)*startPos, loop),0.0)
	)
}).add; 
)

//make a new control Synth, playing on control buses
(
SynthDef("playbufcontrols",{
	
	//control for retrigger (impulse with modulated rate)
	Out.kr(0,Impulse.kr(LFNoise0.kr(0.5, 5, 6)));
	
	//control for jump position in sample (any random frame)
	Out.kr(1,LFNoise0.kr(0.25,0.5,0.5));
	
}).play(s); 
)

a=Synth(\playbuf, [\out, 0, \bufnum, b.bufnum, \rate, 1, \trigger, "c0", \startPos, "c1"]);

//showing unmapping of control signals- unmap the modulation of jump position when retriggered, it will now be fixed
a.set(\startPos,"c")

//set fixed chosen start frame
a.set(\startPos,30000)
 